[アップデート] Amazon Aurora PostgreSQL 16.4 がリリースされたので、Babelfish 4.3 のパーティション機能を確認してみた

[アップデート] Amazon Aurora PostgreSQL 16.4 がリリースされたので、Babelfish 4.3 のパーティション機能を確認してみた

Clock Icon2024.10.01

いわさです。

先日 Aurora PostgreSQL の 16.4 がリリースされました!

https://aws.amazon.com/about-aws/whats-new/2024/09/amazon-aurora-supports-postgresql-new-versions/

これに併せて、Babelfish も 4.3.0 がリリースされています。
Babelfish とは Aurora PostgreSQL の機能で、Aurora が Microsoft SQL Server 用に作成されたアプリケーションからのコマンドを理解出来るようにさせる機能です。
Microsoft SQL Server の全機能に互換性があるわけではないのですが、Babelfish がアップデートされる度に互換性が向上しています。

今回も最新機能を確認して使ってみたいと思います。

バージョン確認

まずはお約束のバージョン確認からです。
前回の 4.2.0 は以下でして、同じ手順で確認します。

https://dev.classmethod.jp/articles/aurora-postgresql-16-3-babelfish-4-2/

マネジメントコンソールで Aurora PostgreSQL の最新バージョンを構築します。
構築時に Babelfish 有効化オプションを ON にします。

818DAF97-5514-4D4C-8FC9-49754FAB6CAD_1_105_c.jpeg

クラスターの準備が出来たら、まずは psql で接続してみます。拡張機能のバージョンから確認しましょう。

% psql -h hoge1001babelfish.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres -d babelfish_db
Password for user postgres: 
psql (14.11 (Homebrew), server 16.4)
WARNING: psql major version 14, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
      SELECT aurora_version() AS aurora_version, version() AS postgresql_version, sys.version() AS Babelfish_compatibility, sys.SERVERPROPERTY('BabelfishVersion') AS Babelfish_Version;
 aurora_version |                                       postgresql_version                                        |                           babelfish_compatibility                           | babelfish_version 
----------------+-------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------+-------------------
 16.4.0         | PostgreSQL 16.4 on x86_64-pc-linux-gnu, compiled by x86_64-pc-linux-gnu-gcc (GCC) 9.5.0, 64-bit | Babelfish for Aurora PostgreSQL with SQL Server Compatibility - 12.0.2000.8+| 4.3.0
                |                                                                                                 | Sep 16 2024 00:16:18                                                       +| 
                |                                                                                                 | Copyright (c) Amazon Web Services                                          +| 
                |                                                                                                 | PostgreSQL 16.4 on x86_64-pc-linux-gnu (Babelfish 4.3.0)                    | 
(1 row)

よしよし。Babelfish バージョンが 4.3.0 であることが確認出来ますね。

新機能を試す

続いて新機能を確認してみましょう。
Amazon Aurora の次のドキュメントから Babelfish のアップデート内容を確認することが出来ます。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraPostgreSQLReleaseNotes/AuroraBabelfish.Updates.html

今回 4.3.0 の目玉はパーティションの機能が一部使えるようになった点でしょうか。

パーティション機能

Babelfish の一部機能は個別のドキュメントが作成されており、パーティションに関するページも以下の個別ページが用意されていました。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/babelfish-partition.html

CREATE PARTITION FUNCTION や CREATE PARTITION SCHEME が使えるようになり、CREATE TABLE や CREATE INDEX の ON 句で指定出来るようになっています。
あとは$PARTITION関数なども提供されています。
本日時点では結構制限事項も多いのですが、次のドキュメントに記載されています。後で LEFT オプションなどの制限は動作確認してみましょう。

https://learn.microsoft.com/ja-jp/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-ver16

まずは sqlcmd で Aurora に接続し、データベースを作成します。

% sqlcmd -S hoge1001babelfish.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U postgres
Password: 
1> create database hogedb;
2> go
1> use hogedb;
2> go
Changed database context to 'hogedb'.

作成出来ました。ここからがアップデートで実現出来るようになった機能ですが、パーティション設定を行っていきます。
まずはパーティション関数を作成します。

https://learn.microsoft.com/ja-jp/sql/t-sql/statements/create-partition-function-transact-sql?view=sql-server-ver16

1> CREATE PARTITION FUNCTION myRangePF1 (int) AS RANGE LEFT FOR VALUES (1, 100, 1000);
2> go
Msg 33557097, Level 16, State 1, Server hoge1001babelfish-instance-1, Line 1
'PARTIION FUNCTION with LEFT option' is not currently supported in Babelfish

エラーとなりました。前述の公式ドキュメントに記載のとおり LEFT オプションは本日時点でサポートされていません。
以下のように記載されています。きっとそのうちサポートされます。

The LEFT boundary option for partition functions isn't yet supported.

ということで、今回は RIGHT オプションでいきます。

1> CREATE PARTITION FUNCTION myRangePF2 (int) AS RANGE RIGHT FOR VALUES (1, 100, 1000);
2> go

続いてパーティションのファイルグループマップ構成を作成します。

https://learn.microsoft.com/ja-jp/sql/t-sql/statements/create-partition-scheme-transact-sql?view=sql-server-ver16

1> CREATE PARTITION SCHEME myRangePS2 AS PARTITION myRangePF2 TO (test1fg, test2fg, test3fg, test4fg);
2> go

問題なく作成出来ました。
最後に、今回はテーブルに設定を行います。

https://learn.microsoft.com/ja-jp/sql/relational-databases/partitions/create-partitioned-tables-and-indexes?view=sql-server-ver16

1> CREATE TABLE myRangeTbl (col1 int PRIMARY KEY, col2 char(10)) ON myRangePS2 (col1);
2> go

パーティションを意識してサンプルデータをいくつか作成します。

1> insert into myRangeTbl values (0, 'aaa');
2> insert into myRangeTbl values (1, 'bbb');
3> insert into myRangeTbl values (2, 'ccc');
4> insert into myRangeTbl values (100, 'ddd');
5> insert into myRangeTbl values (1000, 'ddd');
6> go

(1 rows affected)

(1 rows affected)

(1 rows affected)

(1 rows affected)

(1 rows affected)

今回は実行計画からパーティションスキャン状況を確認します。

1> SET BABELFISH_SHOWPLAN_ALL ON;
2> go
1> select * from myRangeTbl;
2> go
QUERY PLAN                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl                                                                                                                                                                                                                            
Append  (cost=0.00..116.20 rows=5080 width=36)                                                                                                                                                                                                                  
  ->  Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_1 myrangetbl_1  (cost=0.00..22.70 rows=1270 width=36)                                                                                                                                              
  ->  Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_2 myrangetbl_2  (cost=0.00..22.70 rows=1270 width=36)                                                                                                                                              
  ->  Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_3 myrangetbl_3  (cost=0.00..22.70 rows=1270 width=36)                                                                                                                                              
  ->  Seq Scan on f8702d61ede0aa4094e791c6c7613885_partition_0 myrangetbl_4  (cost=0.00..22.70 rows=1270 width=36)                                                                                                                                              
                                                                                                                                                                                                                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 0.218 ms     

あー、いいですね。良さそうでは?
条件指定してもう少し見てみましょう。

1> select * from myRangeTbl where col1 > 100;
2> go
QUERY PLAN                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl where col1 > 100                                                                                                                                                                                                           
Append  (cost=7.43..49.67 rows=846 width=36)                                                                                                                                                                                                                    
  ->  Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_2 myrangetbl_1  (cost=7.43..22.72 rows=423 width=36)                                                                                                                                       
        Recheck Cond: (col1 > 100)                                                                                                                                                                                                                              
        ->  Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_2_pkey  (cost=0.00..7.32 rows=423 width=0)                                                                                                                                          
              Index Cond: (col1 > 100)                                                                                                                                                                                                                          
  ->  Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_3 myrangetbl_2  (cost=7.43..22.72 rows=423 width=36)                                                                                                                                       
        Recheck Cond: (col1 > 100)                                                                                                                                                                                                                              
        ->  Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_3_pkey  (cost=0.00..7.32 rows=423 width=0)                                                                                                                                          
              Index Cond: (col1 > 100)                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 318.822 ms                                                                                                                                                                                                                  
1> select * from myRangeTbl where col1 < 100;
2> go
QUERY PLAN                                                                                                                                                                                                                                                      
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Query Text: select * from myRangeTbl where col1 < 100                                                                                                                                                                                                           
Append  (cost=7.43..49.67 rows=846 width=36)                                                                                                                                                                                                                    
  ->  Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_1 myrangetbl_1  (cost=7.43..22.72 rows=423 width=36)                                                                                                                                       
        Recheck Cond: (col1 < 100)                                                                                                                                                                                                                              
        ->  Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_1_pkey  (cost=0.00..7.32 rows=423 width=0)                                                                                                                                          
              Index Cond: (col1 < 100)                                                                                                                                                                                                                          
  ->  Bitmap Heap Scan on f8702d61ede0aa4094e791c6c7613885_partition_0 myrangetbl_2  (cost=7.43..22.72 rows=423 width=36)                                                                                                                                       
        Recheck Cond: (col1 < 100)                                                                                                                                                                                                                              
        ->  Bitmap Index Scan on f8702d61ede0aa4094e791c6c7613885_partition_0_pkey  (cost=0.00..7.32 rows=423 width=0)                                                                                                                                          
              Index Cond: (col1 < 100)                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish T-SQL Batch Parsing Time: 11.696 ms   

いいですね。パーティションの範囲に従ってスキャン出来てそうです。

さいごに

本日は Amazon Aurora PostgreSQL 16.4 がリリースされたので、Babelfish 4.3 のパーティション機能を確認してみました。

まだ制限事項が多いですが、また SQL Server の機能が開放されましたね。継続的にアップデートがされており良い感じです。
今後も Babelfish の動向をチェックしていきたいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.